package com.little.snake;       //包
import java.awt.Color;       //导包，以调用此包中的方法
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.Timer;

class SnakePanel extends JPanel implements KeyListener, ActionListener{
	private Imagepic ip=new Imagepic();    //实例化对象
	private JFrame frm=new JFrame();	  //创建游戏框架
	private Food fd=new Food(); 
	private Timer timer = new Timer(150,this);    //定时器
    private int[] snakex=new int [750];  //储存蛇身数组
	private int[] snakey=new int [750];
	private int len=3;      //初始化长度
	private int score;        // 定义分数
	protected int maxScore = 500; // 最大分数
	protected int maxLenth = 750;  // 最长长度
	private String direction="R";     //声明（右L左U上D下）方向
	private boolean isStarted=false;  // 判断游戏是否开始
	private boolean isFailed=false;   // 判断游戏是否结束
	private static boolean meetWalldie = true;// 判断是否撞墙死,初始化撞墙死
	
	private JMenu mn=new JMenu("菜单");       //创建菜单
	private JMenuBar bar=new JMenuBar();//创建菜单栏	
	private JMenuItem n=new JMenuItem("暂停/继续");  //创建暂停/继续菜单项
	private JMenuItem o=new JMenuItem("重玩");
	private JMenuItem c=new JMenuItem("退出游戏");

	public SnakePanel() {			
		mn.add(n);  //将暂停菜单项添加到菜单		
		mn.add(o);  //将重玩菜单项添加到菜单
		mn.add(c);	//将退出菜单项添加到菜单
		bar.add(mn);     //将菜单加入到菜单栏
		frm.setJMenuBar(bar);       //将菜单栏加入到窗口中
		
		n.addActionListener(this);  //设置按键监听
		o.addActionListener(this);
		c.addActionListener(this);
		setFocusable(true);   //获取焦点
		addKeyListener(this); //添加键盘监听接口
		frm.setLayout(null);       
		frm.setBounds(300,0,950,800);		
		initSnake();  //放置静态蛇      
		setBounds(0,0,950,800);    //画布位置和大小
		frm.add(this);
		frm.setTitle("贪吃蛇小游戏 ");
		frm.setResizable(false);    //不可改变窗口大小
		frm.setVisible(true);
		frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //关闭时退出程序
	}
	public void initSnake() {   //初始化蛇
		isStarted=false;
		isFailed=false;
		score=0;
		len=3;
		direction="R";       //初始化方向为：向右
		snakex[0]=100;        //蛇的初始坐标
		snakey[0]=100;
		snakex[1]=75;
		snakey[1]=100;
		snakex[2]=50;
		snakey[2]=100;	
		timer.setDelay(150);     //延迟（每隔）150毫秒执行一次任务
	}		
	public void paint(Graphics g) {       //paint方法
		super.paint(g);       //调用父类的paint方法绘制组件，表示在原来图像的基础上，再画图
		g.setColor(Color.pink);      //设置面板颜色为粉色
		g.fillRect(0,0,950,800);   //画笔填充矩形
		
		if(direction==("R")) {        //画蛇头
			ip.right.paintIcon(this, g, snakex[0], snakey[0]);
		}else if(direction.equals("L")) {
			ip.left.paintIcon(this, g, snakex[0], snakey[0]);
		}else if(direction.equals("U")) {
			ip.up.paintIcon(this, g, snakex[0], snakey[0]);	
		}else if(direction.equals("D")) {
			ip.down.paintIcon(this, g, snakex[0], snakey[0]);	
		}		
		for(int i=1;i<len;i++) {         //画蛇身
			ip.body.paintIcon(this,g,snakex[i],snakey[i]);	
		}			
		if(!isStarted) {              //画开始提示语
			g.setColor(Color.WHITE);
			g.setFont(new Font("arial",Font.BOLD,30));   //字体，加粗，字的大小
			g.drawString("Press SPace to Start/Pause", 300, 300);    //字的位置
		}		
		if (isFailed) {              //画失败提示语
			g.setColor(Color.WHITE);
			g.setFont(new Font("华文彩云", Font.BOLD, 30));     //同上
			g.drawString("不服？按空格再来一次！", 300, 350);
		}
		ip.food.paintIcon(this, g, fd.foodx, fd.foody);     //画食物		
		g.setColor(Color.WHITE);              //显示分数
		g.setFont(new Font("华文彩云", Font.BOLD, 30));
		g.drawString("得分："+score,500,50);		
		ip.star.paintIcon(this, g, fd.starx, fd.stary);  //显示星星和蘑菇
		ip.mr.paintIcon(this,g,fd.mrx,fd.mry);
		repaint();		//实现重画
		
	}
	public void keyPressed(KeyEvent e) {      //（按键监听）按下按键时事件发生
		timer.start();                //定时器开始执行
		int KeyCode=e.getKeyCode();      //声明整型变量并调用getKeyCode方法，给变量赋值
		if(KeyCode == KeyEvent.VK_SPACE) {    
			if(isFailed) {        //当游戏结束，按空格键，重玩，初始化蛇
				initSnake();           
				isStarted=!isStarted;
			}else {          //当游戏未结束，按空格键，暂停游戏
				isStarted=!isStarted;
			}
		}
		if(isStarted){              //添加当游戏开始，蛇上下左右移动事件
			if (e.getKeyCode() == KeyEvent.VK_UP  && direction != "D" )  {
				direction = "U";
			}

			else if (e.getKeyCode() == KeyEvent.VK_DOWN && direction != "U") {
				direction = "D";

			}
			else if (e.getKeyCode() == KeyEvent.VK_RIGHT && direction != "L") {

				direction = "R";
			}
			else if (e.getKeyCode()== KeyEvent.VK_LEFT && direction != "R" ) {
				direction = "L";
			}
		}
	}
	public void actionPerformed(ActionEvent e) {        // 事件监听

		if(isStarted && !isFailed) {           //游戏进行中，则如下：
			
			for(int i=len-1;i>0;i--) {          //移动身体
				snakex[i]=snakex[i-1];
				snakey[i]=snakey[i-1];
			}			
			if(direction.equals("R")) {         //设置头移动的范围				
				snakex[0]=snakex[0]+25;       //横坐标+25，向右走
				if(snakex[0]>950) {
					snakex[0]=25;
				}
			}else if(direction.equals("L")) { 				
				snakex[0]=snakex[0]-25;       //横坐标-25
				if(snakex[0]<0) {
					snakex[0]=950;
				}
			}else if(direction.equals("U")) {			
				snakey[0]=snakey[0]-25;      //纵坐标-25
				if(snakey[0]<0) {
					snakey[0]=800;
				}
			}else if(direction.equals("D")) {			
				snakey[0]=snakey[0]+25;      //纵坐标+25
				if(snakey[0]>730) {
					snakey[0]=0;
				}
			}
		}
		if (meetWalldie) {      //撞到墙的判断
			if (snakex[0] > 899|| snakex[0] < 10 || (snakey[0] < 1) || snakey[0] >699) {
				isFailed = true;
				score=0;
				timer.setDelay(150);
			}
		}
		if (snakex[0] == fd.foodx && snakey[0] == fd.foody) {     //吃到食物
			len++;                                      
			score+=10;
			fd.foodx = fd.f.nextInt(34) * 25 + 25;           //随机出现食物
			fd.foody = fd.f.nextInt(23) * 25 + 75;
		}else if (snakex [0]==fd.starx&&snakey[0]==fd.stary||snakex [0]==fd.starx&&snakey[0]==fd.stary+25) {   //当吃到星星的时候，蛇的速度加快，加分，星星随机产生
			timer.setDelay(60);
			score+=50;
			fd.starx=fd.t.nextInt(34)*25+25;
			fd.stary=fd.t.nextInt(23)*25+25;
		}
		else if(snakex [0]==fd.mrx&&snakey[0]==fd.mry||snakex [0]==fd.mrx&&snakey[0]==fd.mry+25) {     //当吃到毒蘑菇的时候，蛇的速度变慢，减分，毒蘑菇随机产生

			timer.setDelay(400);
			score-=30;
			fd.mrx=fd.m.nextInt(34)*25+25;
			fd.mry=fd.m.nextInt(23)*25+25;						
		}
		for (int i = 1; i < len; i++) {   // 如果蛇头碰到自己的身体游戏结束
			if (snakex[0] == snakex[i] && snakey[0] == snakey[i]) {
				isFailed = true;
				score=0;
			}
		}
		if (e.getSource()==n) {    //按暂停/继续菜单
			isStarted=!isStarted;
		}else if(e.getSource()==o) {  //按重玩菜单，初始化蛇					
			initSnake();

		}else if(e.getSource()==c) {	//按退出菜单，退出游戏界面，返回主界面
			frm.setVisible(false);
			new Snake();
		}if(isFailed) {          //如果失败，暂停/继续菜单项变灰，菜单项失效
			n.setEnabled(false);
		}else {                    //如果没有失败，则菜单项有效
			n.setEnabled(true);
		}
	}		
	public void keyTyped(KeyEvent e) {      
	}
	public void keyReleased(KeyEvent e) {
	}
}